package br.univap.aed.cenario2.sort;

public class QuickSortInPlace
{
	private Integer[] vetor_sort;
	private int comparacoes;
	private int copias;
	
	public QuickSortInPlace() {
		comparacoes = 0;
		copias = 0;
	}

	public void sort(Integer[] vetor)
	{
		vetor_sort = vetor;

		this.execute(vetor_sort, 0, (vetor_sort.length-1));
	}

	private void execute(Integer[] vetor, int esquerda, int direita)
	{
		int pivo = vetor[esquerda];
		int esquerda_aux = esquerda;
		int direita_aux = direita;

		while(esquerda < direita)
		{
			while((vetor[direita] >= pivo) && (esquerda < direita))
				direita--;

			if(esquerda != direita)
			{
				vetor[esquerda] = vetor[direita];
				esquerda++;
				comparacoes++;
			}

			while((vetor[esquerda] <= pivo) && (esquerda < direita))
				esquerda++;

			if(esquerda != direita)
			{
				vetor[direita] = vetor[esquerda];
				direita--;
				comparacoes++;
			}
		}

		vetor[esquerda] = pivo;

		pivo = esquerda;

		esquerda = esquerda_aux;

		direita = direita_aux;

		if(esquerda < pivo) {
			comparacoes++;
			this.execute(vetor, esquerda, pivo-1);
		}
		
		if(direita > pivo) {
			comparacoes++;
			this.execute(vetor, pivo+1, direita);
		}
		
		this.vetor_sort = vetor;
	}

	public Integer[] getVetorSort()
	{
		return vetor_sort;
	}

	public void cleanVetorSort()
	{
		this.vetor_sort = new Integer[0];
	}

	public int getComparacoes() {
		return this.comparacoes;
	}

	public int getCopias() {
		return this.copias;
	}
}
